package com.yupi.project.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yupi.project.annotation.AuthCheck;
import com.yupi.project.service.InterfaceInvokeInfoService;
import com.yupi.project.service.UserService;
import com.yupi.yuapicommon.model.common.BaseResponse;
import com.yupi.yuapicommon.model.common.BusinessException;
import com.yupi.yuapicommon.model.common.ErrorCode;
import com.yupi.yuapicommon.model.common.ResultUtils;
import com.yupi.yuapicommon.model.constant.CommonConstant;
import com.yupi.yuapicommon.model.dto.interfaceInvokeInfo.InterfaceInvokeInfoDeleteRequest;
import com.yupi.yuapicommon.model.dto.interfaceInvokeInfo.InterfaceInvokeInfoQueryRequest;
import com.yupi.yuapicommon.model.entity.InterfaceInvokeInfo;
import com.yupi.yuapicommon.model.entity.User;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Objects;

/**
 * @description: 接口调用信息
 * @author SummerBird
 * @date 2024/1/21 16:27
 * @version 1.0
 */
@RestController
@RequestMapping("/interfaceInvokeInfo")
@Slf4j
public class InterfaceInvokeInfoController {

    @Resource
    private InterfaceInvokeInfoService interfaceInvokeInfoService;

    @Resource
    private UserService userService;

    // region 增删改查

    /**
     * 根据 id 获取
     *
     * @param id
     * @return
     */
    @GetMapping("/get")
    @ApiOperation("根据 id 获取调接口调用结果信息")
    public BaseResponse<InterfaceInvokeInfo> getInterfaceInvokeInfoById(long id, HttpServletRequest request) {
        userService.getLoginUser(request);
        if (id <= 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        InterfaceInvokeInfo InterfaceInvokeInfo = interfaceInvokeInfoService.getById(id);
        return ResultUtils.success(InterfaceInvokeInfo);
    }

    /**
     * 根据 id 删除
     *
     * @param interfaceInvokeInfoDeleteRequest
     * @return
     */
    @PostMapping("/get")
    @ApiOperation("根据 id 删除调接口调用结果信息")
    public BaseResponse<Boolean> deleteInterfaceInvokeInfoById(InterfaceInvokeInfoDeleteRequest interfaceInvokeInfoDeleteRequest, HttpServletRequest request) {
        userService.getLoginUser(request);
        Long id = interfaceInvokeInfoDeleteRequest.getId();
        if (Objects.isNull(id) || id <= 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        return ResultUtils.success(interfaceInvokeInfoService.removeById(id));
    }

    /**
     * 获取列表（仅管理员可使用）
     *
     * @param InterfaceInvokeInfoQueryRequest
     * @return
     */
    @AuthCheck(mustRole = "admin")
    @GetMapping("/list")
    @ApiOperation("获取接口调用结果列表(admin)")
    public BaseResponse<List<InterfaceInvokeInfo>> listInterfaceInvokeInfo(InterfaceInvokeInfoQueryRequest InterfaceInvokeInfoQueryRequest, HttpServletRequest request) {
        if(!userService.isAdmin(request)){
            ResultUtils.error(ErrorCode.NO_AUTH_ERROR);
        }
        InterfaceInvokeInfo InterfaceInvokeInfoQuery = new InterfaceInvokeInfo();
        if (InterfaceInvokeInfoQueryRequest != null) {
            BeanUtils.copyProperties(InterfaceInvokeInfoQueryRequest, InterfaceInvokeInfoQuery);
        }
        QueryWrapper<InterfaceInvokeInfo> queryWrapper = new QueryWrapper<>(InterfaceInvokeInfoQuery);
        List<InterfaceInvokeInfo> InterfaceInvokeInfoList = interfaceInvokeInfoService.list(queryWrapper);
        return ResultUtils.success(InterfaceInvokeInfoList);
    }

    /**
     * 分页获取列表
     *
     * @param InterfaceInvokeInfoQueryRequest
     * @param request
     * @return
     */
    @GetMapping("/list/page")
    @ApiOperation("分页获取接口调用结果信息列表(当前用户)")
    public BaseResponse<Page<InterfaceInvokeInfo>> listInterfaceInvokeInfoByPage(InterfaceInvokeInfoQueryRequest InterfaceInvokeInfoQueryRequest, HttpServletRequest request) {
        if (InterfaceInvokeInfoQueryRequest == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        InterfaceInvokeInfo interfaceInvokeInfoQuery = new InterfaceInvokeInfo();
        BeanUtils.copyProperties(InterfaceInvokeInfoQueryRequest, interfaceInvokeInfoQuery);
        User loginUser = userService.getLoginUser(request);
        if(Objects.isNull(loginUser)){
            ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR);
        }
        Long userId = loginUser.getId();
        Long interfaceinfoid = interfaceInvokeInfoQuery.getInterfaceInfoid();
        Integer status = interfaceInvokeInfoQuery.getStatus();
        long current = InterfaceInvokeInfoQueryRequest.getCurrent();
        long size = InterfaceInvokeInfoQueryRequest.getPageSize();
        String sortField = InterfaceInvokeInfoQueryRequest.getSortField();
        String sortOrder = InterfaceInvokeInfoQueryRequest.getSortOrder();
        // 限制爬虫
        if (size > 50) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        // 查询条件
        QueryWrapper<InterfaceInvokeInfo> queryWrapper = new QueryWrapper<>(interfaceInvokeInfoQuery);
        queryWrapper.orderBy(StringUtils.isNotBlank(sortField),
                sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
        queryWrapper.eq(userId != null, "userId", userId);
        queryWrapper.eq(status != null, "status", status);
        queryWrapper.eq("isDelete", 0);
        queryWrapper.eq(interfaceinfoid != null, "interfaceinfoid", interfaceinfoid);
        Page<InterfaceInvokeInfo> InterfaceInvokeInfoPage = interfaceInvokeInfoService.page(new Page<>(current, size), queryWrapper);
        return ResultUtils.success(InterfaceInvokeInfoPage);
    }

}
